上一篇我們學會了如何使用Python寫Node,今天來改用C++囉!
基本上跟Python是做一樣的事情,不過C++會比較麻煩一點,就讓我們繼續看下去吧!
關於ROS的roscpp
模組,官網一樣有教學、常用API及文件可以參考,那我們一樣使用C++來寫一個Hello World出來吧!
首先在~/catkin_ws/src/beginner_tutorials/src
中新增一個.cpp
檔,就可以開始寫程式囉!
$ cd ~/catkin_ws/src/beginner_tutorials/src
$ vim hello.cpp
在hello.cpp
中新增以下內容:
#include <ros/ros.h> // 引用 ros.h 檔
int main(int argc, char** argv){
ros::init(argc, argv, "hello_cpp_node"); // 初始化 hello_cpp_node
ros::NodeHandle handler; // node 的 handler
ROS_INFO("Hello World!"); // 印出 Hello World
}
可以看出這個cpp檔跟python檔最大的不同就是多了一個handler,是個用來當作跟node相關的溝通功能如topics, services, parameters 等的介面,其他部分都大同小異,因此就不贅述啦!
cpp檔不像python檔一樣可以直接被執行,需要經過編譯以後才能轉成執行檔,因此我們需要修改beginner_tutorial
內的CMakeLists.txt
,為其設定好連結的函式庫。
由於他的CMakeLists.txt
太長了,在此擷取片段做為參考:
//...上略
## Declare a C++ executable
## ...
## ...
## ...
add_executable(hello.exe src/hello.cpp)
target_link_libraries(hello.exe ${catkin_LIBRARIES})
## Rename C++ executable without prefix
//...下略
修改完CMakeLists.txt
後,接著須回到工作區的根目錄,也就是/catkin_ws
中再執行一次catkin_make
,他就會自己幫我們編譯好hello.cpp
的執行檔(hello.exe
)囉!
編好的執行檔會放在/catkin_ws/devel/lib/beginner_tutorials
裡面,執行後的畫面如下:
記得一樣要有另外一個視窗執行roscore
,才有master
可以驅動node
喔!
接下來修改hello.cpp
,一樣新增一個迴圈,讓他在程式執行期間每秒印出一個hello world出來,程式碼如下:
#include <ros/ros.h> // 引用 ros.h 檔
int main(int argc, char** argv){
ros::init(argc, argv, "hello_cpp_node"); // 初始化hello_cpp_node
ros::NodeHandle handler; // node 的 handler
while (ros::ok()){ // 在 ros 順利執行時
ROS_INFO("Hello World!"); // 印出 Hello World
ros::Duration(1).sleep(); // 間隔 1 秒
}
}
修改完hello.cpp
後,因為CMakeLists.txt
已經改好了,只要再回去執行一次catkin_make
,就可以重新編譯出一個新的hello.exe
檔囉!
接下來再重新執行一次hello.exe
,由於他會一直被執行,因此使用rosnode list
這個指令一樣可以看到這個hello_cpp_node
正在運行中囉!
到此,我們已經會使用python和c++建立不同的node啦! 小妹在此為大家整理一下撰寫node應該要注意的事項:
CMakeLists.txt
才能編譯roscore
進行管理的動作rosnode list
可以查看有哪些node正在運行中catkin_make
只能在該工作區的根目錄才能執行最後,希望大家都可以順利寫出自己的node出來玩一玩囉! 我們明天見~